﻿//IMarketDataDrive.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Storages
{
	using System;
	using System.Collections.Generic;
	using System.IO;

	using StockSharp.BusinessEntities;
	using StockSharp.Algo.Candles;

	/// <summary>
	/// Интерфейс, описывающий хранилище, ассоциированное с <see cref="IMarketDataStorage"/>.
	/// </summary>
	public interface IMarketDataStorageDrive
	{
		/// <summary>
		/// Получить все даты, для которых записаны маркет-данные.
		/// </summary>
		IEnumerable<DateTime> Dates { get; }

		/// <summary>
		/// Удалить кэш-файлы, хранящие в себе информацию о доступных диапазонах времени.
		/// </summary>
		void ClearDatesCache();

		/// <summary>
		/// Удалить маркет-данные из хранилища за указанную дату.
		/// </summary>
		/// <param name="date">Дата, для которой необходимо удалить все данные.</param>
		void Delete(DateTime date);

		/// <summary>
		/// Сохранить данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="date">Дата, для которой необходимо сохранить данные.</param>
		/// <param name="rawData">Данные в формате хранилища StockSharp.</param>
		void Save(DateTime date, byte[] rawData);

		/// <summary>
		/// Загрузить данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="date">Дата, для которой необходимо загрузить данные.</param>
		/// <returns>Данные в формате хранилища StockSharp. Если данных не существует, то будет возвращено null.</returns>
		byte[] Load(DateTime date);

		/// <summary>
		/// Сохранить данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="date">Дата, для которой необходимо сохранить данные.</param>
		/// <param name="rawData">Данные в формате хранилища StockSharp.</param>
		void SaveStream(DateTime date, Stream rawData);

		/// <summary>
		/// Загрузить данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="date">Дата, для которой необходимо загрузить данные.</param>
		/// <returns>Данные в формате хранилища StockSharp. Если данных не существует, то будет возвращено <see cref="Stream.Null"/>.</returns>
		Stream LoadStream(DateTime date);
	}

	/// <summary>
	/// Интерфейс, описывающий хранилище (база данных, файл и т.д.).
	/// </summary>
	public interface IMarketDataDrive
	{
		/// <summary>
		/// Получить для инструмента доступные типы свечек с параметрами.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Доступные типы свечек с параметрами.</returns>
		IEnumerable<Tuple<Type, object[]>> GetCandleTypes(Security security);

		/// <summary>
		/// Получить хранилище для <see cref="IMarketDataStorage"/>.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <returns>Хранилище для <see cref="IMarketDataStorage"/>.</returns>
		IMarketDataStorageDrive GetStorageDrive(Security security, Type dataType, object arg);
	}

	/// <summary>
	/// Базовая реализация <see cref="IMarketDataDrive"/>.
	/// </summary>
	public abstract class BaseMarketDataDrive : IMarketDataDrive
	{
		/// <summary>
		/// Инициализировать <see cref="BaseMarketDataDrive"/>.
		/// </summary>
		protected BaseMarketDataDrive()
		{
		}

		/// <summary>
		/// Получить для инструмента доступные типы свечек с параметрами.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Доступные типы свечек с параметрами.</returns>
		public abstract IEnumerable<Tuple<Type, object[]>> GetCandleTypes(Security security);

		/// <summary>
		/// Создать хранилище для <see cref="IMarketDataStorage"/>.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <returns>Хранилище для <see cref="IMarketDataStorage"/>.</returns>
		public abstract IMarketDataStorageDrive GetStorageDrive(Security security, Type dataType, object arg);
	}
}